package Modelo;
import java.util.Iterator;
import java.util.List;

import junit.framework.TestCase;

public class PooglinTest extends TestCase {
	
	public void testVelocidad (){
		Posicion posicion = new Posicion (2,7);
		Planeta planeta = new Planeta("testPooglin.txt");
		Terreno terreno = new Terreno ("testPooglin.txt", planeta);
		Pooglin pooglin = new Pooglin (posicion, terreno);
		
		assertEquals (1, pooglin.getVelocidad());
		pooglin.acelerar();
		assertEquals (2, pooglin.getVelocidad());
		pooglin.setVelocidadNormal();
		assertEquals (1, pooglin.getVelocidad());
	}
	
	public void testCaida(){
		Posicion posicion = new Posicion (12,6);
		Planeta planeta = new Planeta("testPooglin.txt");
		Terreno terreno = new Terreno ("testPooglin.txt", planeta);
		Pooglin pooglin = new Pooglin (posicion, terreno);
		
		posicion = pooglin.getPosicion();
		assertEquals (12, posicion.getPosicionX());
		assertEquals (6, posicion.getPosicionY());
		pooglin.mover();
		assertEquals (13, posicion.getPosicionX());
		assertEquals (6, posicion.getPosicionY());		
		pooglin.mover();
		assertEquals (13, posicion.getPosicionX());
		assertEquals (7, posicion.getPosicionY());		
		pooglin.mover();
		assertEquals (13, posicion.getPosicionX());
		assertEquals (8, posicion.getPosicionY());		
		pooglin.mover();
		assertEquals (13, posicion.getPosicionX());
		assertEquals (9, posicion.getPosicionY());		
		pooglin.mover();
		assertEquals (13, posicion.getPosicionX());
		assertEquals (10, posicion.getPosicionY());		
	}
	
	public void testDireccion (){
		Posicion posicion = new Posicion (40,7);
		Planeta planeta = new Planeta("testPooglin.txt");
		Terreno terreno = new Terreno ("testPooglin.txt", planeta);
		Pooglin pooglin = new Pooglin (posicion, terreno);
		posicion = pooglin.getPosicion();
		
		assertEquals (40, posicion.getPosicionX());
		assertEquals (7, posicion.getPosicionY());
	

		pooglin.mover(); //camina hacia la derecha
		assertTrue (pooglin.haciaDerecha());
		assertEquals (41, posicion.getPosicionX());
		assertEquals (7, posicion.getPosicionY());	
		
		pooglin.mover();
		//choca con una roca,cambia la direccion (izquierda) y mueve hacia la izquierda
		assertTrue (!pooglin.haciaDerecha());
		assertEquals (40, posicion.getPosicionX());
		assertEquals (7, posicion.getPosicionY());
		
		
		pooglin.mover(); //ahora camina hacia la izquierda
		assertTrue (!pooglin.haciaDerecha());
		assertEquals (39, posicion.getPosicionX());
		assertEquals (7, posicion.getPosicionY());
		
		pooglin.mover();
		//choca nuevamente con una roca, cambia la direccion (derecha) y mueve hacia la derecha
		assertTrue (pooglin.haciaDerecha());
		assertEquals (40, posicion.getPosicionX());
		assertEquals (7, posicion.getPosicionY());
	}
	
	public void testHabilidades (){
		Posicion posicion = new Posicion (16,12);
		Planeta planeta = new Planeta("testPooglin.txt");
		Terreno terreno = new Terreno ("testPooglin.txt", planeta);
		Pooglin pooglin = new Pooglin (posicion, terreno);
		
		Habilidad taladro = new TaladroUltraSonico();
		pooglin.setHabilidad(taladro);
		assertSame (taladro, pooglin.getHabilidad());
		
		Habilidad congelamiento = new Congelamiento();
		pooglin.setHabilidad(congelamiento);
		assertSame (congelamiento, pooglin.getHabilidad());
		
		Habilidad rayoLaser = new RayoLaser();
		pooglin.setHabilidad(rayoLaser);
		assertSame (rayoLaser, pooglin.getHabilidad());

		Habilidad platillo = new PlatilloVolador();
		pooglin.setHabilidad(platillo);
		assertSame (platillo, pooglin.getHabilidad());

		Habilidad transportacion = new Teletransportacion();
		pooglin.setHabilidad(transportacion);
		assertSame (transportacion, pooglin.getHabilidad());
		
		Habilidad tunelElectromagnetico = new TunelElectromagnetico();
		pooglin.setHabilidad(tunelElectromagnetico);
		assertSame (tunelElectromagnetico, pooglin.getHabilidad());
	}
	
	public void testTaladro (){
		Posicion posicion = new Posicion (8,7);
		Planeta planeta = new Planeta("testPooglin.txt");
		Terreno terreno = new Terreno ("testPooglin.txt", planeta);
		Pooglin pooglin = new Pooglin (posicion, terreno);
		
		posicion=pooglin.getPosicion();
		Habilidad taladro = new TaladroUltraSonico();
		pooglin.setHabilidad(taladro);
		// Posicion inicial
		assertEquals (8, posicion.getPosicionX());
		assertEquals (7, posicion.getPosicionY());
		// Aca muevo el pooglin, y se excava un bloque hacia abajo
		pooglin.mover();
		assertEquals (8, posicion.getPosicionX());
		assertEquals (8, posicion.getPosicionY());
		// Aca muevo el pooglin, y se excava otro bloque hacia abajo
		pooglin.mover();
		assertEquals (8, posicion.getPosicionX());
		assertEquals (9, posicion.getPosicionY());
		// Aca muevo el pooglin, y se excava otro bloque hacia abajo
		pooglin.mover();
		assertEquals (8, posicion.getPosicionX());
		assertEquals (10, posicion.getPosicionY());
		// Aca muevo el pooglin, y se excava otro bloque hacia abajo
		pooglin.mover();
		assertEquals (8, posicion.getPosicionX());
		assertEquals (11, posicion.getPosicionY());
		// Aca muevo el pooglin, y se excava otro bloque hacia abajo
		pooglin.mover();
		assertEquals (8, posicion.getPosicionX());
		assertEquals (12, posicion.getPosicionY());
		// Aca muevo el pooglin, y se queda atrapado en el pozo excavado
		pooglin.mover();
		assertEquals (8, posicion.getPosicionX());
		assertEquals (12, posicion.getPosicionY());
	}
	
	public void testCongelamiento (){
		Planeta planeta = new Planeta("testPooglin.txt");
		// Agrego un pooglin al planeta
		planeta.agregarPooglin();
		Pooglin pooglin=null;
		List<Pooglin> pooglins = planeta.getPooglins();
		// Obtengo el pooglin
		Iterator<Pooglin> iterador = pooglins.iterator();
		if (iterador.hasNext()){
			pooglin=iterador.next();
		}
		
		// Posicion inicial es donde esta la puerta de entrada al planeta		
		assertEquals (2, pooglin.getPosicion().getPosicionX());
		assertEquals (7, pooglin.getPosicion().getPosicionY());
		// Aca muevo el pooglin y se dirige hacia la derecha
		pooglin.mover();
		assertEquals (3, pooglin.getPosicion().getPosicionX());
		assertEquals (7, pooglin.getPosicion().getPosicionY());
		// Aca utilizo la habilidad congelamiento y se murio
		Habilidad congelamiento = new Congelamiento();
		pooglin.setHabilidad(congelamiento);
		pooglin.mover();
		assertTrue (pooglin.estaMuerto());
	}
	
	public void testRayoLaser (){
		Posicion posicion = new Posicion (24,12);
		Planeta planeta = new Planeta("testPooglin.txt");
		Terreno terreno = new Terreno ("testPooglin.txt", planeta);
		Pooglin pooglin = new Pooglin (posicion, terreno);
		
		posicion=pooglin.getPosicion();
		Habilidad rayoLaser = new RayoLaser();
		pooglin.setHabilidad(rayoLaser);
		// Posicion inicial
		assertEquals (24, posicion.getPosicionX());
		assertEquals (12, posicion.getPosicionY());
		// Aca muevo el pooglin, y se rompe un bloque tierra hacia derecha
		pooglin.mover();
		assertEquals (25, posicion.getPosicionX());
		assertEquals (12, posicion.getPosicionY());
		// Aca muevo el pooglin, y se rompe un bloque tierra hacia derecha
		pooglin.mover();
		assertEquals (26, posicion.getPosicionX());
		assertEquals (12, posicion.getPosicionY());
		// Aca muevo el pooglin, y se rompe un bloque tierra hacia derecha
		pooglin.mover();
		assertEquals (27, posicion.getPosicionX());
		assertEquals (12, posicion.getPosicionY());
		// Aca muevo el pooglin, y se rompe un bloque tierra hacia derecha
		pooglin.mover();
		assertEquals (28, posicion.getPosicionX());
		assertEquals (12, posicion.getPosicionY());
		// Aca se le termino los disparos, choca con la tierra y se rebota
		pooglin.mover();
		assertFalse  (pooglin.haciaDerecha());
		assertEquals (27, posicion.getPosicionX());
		assertEquals (12, posicion.getPosicionY());
		
	}
	
	public void testPlatilloVolador (){
		Posicion posicion = new Posicion (13,6);
		Planeta planeta = new Planeta("testPooglin.txt");
		Terreno terreno = new Terreno ("testPooglin.txt", planeta);
		Pooglin pooglin = new Pooglin (posicion, terreno);
		
		posicion=pooglin.getPosicion();
		Habilidad platillo = new PlatilloVolador();
		pooglin.setHabilidad(platillo);
		// Posicion inicial
		assertEquals (13, posicion.getPosicionX());
		assertEquals (6, posicion.getPosicionY());
		// Aca muevo el pooglin, y se cae hacia abajo
		pooglin.mover();
		assertEquals (13, posicion.getPosicionX());
		assertEquals (7, posicion.getPosicionY());
		// Aca muevo el pooglin, y se cae hacia abajo
		pooglin.mover();
		assertEquals (13, posicion.getPosicionX());
		assertEquals (8, posicion.getPosicionY());
		// Aca muevo el pooglin, y se cae hacia abajo
		pooglin.mover();
		assertEquals (13, posicion.getPosicionX());
		assertEquals (9, posicion.getPosicionY());
		// Aca muevo el pooglin, y se cae hacia abajo
		pooglin.mover();
		assertEquals (13, posicion.getPosicionX());
		assertEquals (10, posicion.getPosicionY());
		// Aca muevo el pooglin, y se cae hacia abajo
		pooglin.mover();
		assertEquals (13, posicion.getPosicionX());
		assertEquals (11, posicion.getPosicionY());
		// Aca muevo el pooglin, y se cae hacia abajo
		pooglin.mover();
		assertEquals (13, posicion.getPosicionX());
		assertEquals (12, posicion.getPosicionY());
		// Como el pooglin llego bien a la tierra, mueve hacia derecha
		pooglin.mover();
		assertEquals (14, posicion.getPosicionX());
		assertEquals (12, posicion.getPosicionY());
	}
	
	public void testTeletransportacion (){
		Posicion posicion = new Posicion (12,6);
		Planeta planeta = new Planeta("testPooglin.txt");
		Terreno terreno = new Terreno ("testPooglin.txt", planeta);
		Pooglin pooglin = new Pooglin (posicion, terreno);
		
		posicion=pooglin.getPosicion();
		Habilidad transportacion = new Teletransportacion();
		pooglin.setHabilidad(transportacion);
		// Posicion inicial
		assertEquals (12, posicion.getPosicionX());
		assertEquals (6, posicion.getPosicionY());
		// Aca muevo el pooglin, y se teletransporta a 20 pasos mas adelante
		// y como en 20 pasos mas adelante abajo es vacio, por lo tanto cae
		pooglin.mover();
		assertEquals (32, posicion.getPosicionX());
		assertEquals (7, posicion.getPosicionY());
		
	}
	
	public void testTunelElectromagnetico (){
		Posicion posicion = new Posicion (25,7);
		Planeta planeta = new Planeta("testPooglin.txt");
		Terreno terreno = new Terreno ("testPooglin.txt", planeta);
		Pooglin pooglin = new Pooglin (posicion, terreno);
		
		posicion=pooglin.getPosicion();
		Habilidad tunel = new TunelElectromagnetico();
		pooglin.setHabilidad(tunel);
		// Posicion inicial
		assertEquals (25, posicion.getPosicionX());
		assertEquals (7, posicion.getPosicionY());
		// Aca muevo el pooglin, y se construye un bloque de tunel en el mismo lugar
		// y avanza una unidad hacia diagonal arriba
		pooglin.mover();
		assertEquals (26, posicion.getPosicionX());
		assertEquals (6, posicion.getPosicionY());
		// Aca muevo otra vez y se construye otro bloque de tunel en el mismo lugar
		// y avanza una unidad hacia diagonal arriba
		pooglin.mover();
		assertEquals (27, posicion.getPosicionX());
		assertEquals (5, posicion.getPosicionY());
		// Aca muevo otra vez y como se le termino de construir tuneles, cae
		pooglin.mover();
		assertEquals (27, posicion.getPosicionX());
		assertEquals (6, posicion.getPosicionY());
		
	}
	
}